﻿/**
 * @version beta 1.0
 */
package com.midia {
	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.events.Event;
	import flash.text.TextFormat;
	
	import flash.ui.Keyboard;
	import flash.events.KeyboardEvent;

	import laet.as3subtitle.SRT;
	import laet.as3subtitle.SubtitleRow;
	import laet.as3subtitle.SubtitleTime;

	import com.utils.timer.ChronoTrigger;
	import com.utils.timer.ChronoTriggerEvent;

	import com.midia.playerVideo.DadosVideo;
	import com.midia.playerVideo.PlayerVideo;
	import com.midia.playerVideo.events.PlayerVideoEvent;

	/**
	* Player de Video com legenda no formato srt.
	* @author Ricardo Teixeira
	*/
	public class PlayerVideoSub extends Sprite {
				
		private var lista:Array;
		private var indice:uint = 0;
		private var chrono:ChronoTrigger;
		private var playerVideo:PlayerVideo;
		private var status:TextField;
		private var campoLegenda:TextField;
		private var sub:SRT;
		
		/**
		 * Método construtor.
		 * Inicializa as instâncias, define os eventos e o frame rate.
		 */
		public function PlayerVideoSub () {
			this.stage.frameRate = 30;
			this.status = this.statusText;
			this.campoLegenda = this.texto;
			
			this.playerVideo = player;
			this.playerVideo.addEventListener (PlayerVideoEvent.VIDEO_PLAY_PAUSE, this.onPlayPause);
			this.playerVideo.addEventListener (PlayerVideoEvent.VIDEO_SEEK, this.onSeek);
			
			this.sub = new SRT ("Lost.S04E02.srt");
			this.sub.addEventListener (Event.COMPLETE, this.onParseComplete);
			this.sub.loadSubtitle();

			this.chrono = new ChronoTrigger ();
			this.chrono.addEventListener (ChronoTriggerEvent.UPDATE, this.onUpdateTime);
			
			this.stage.focus = this;
			this.addEventListener (KeyboardEvent.KEY_DOWN, this.onKeyDownEvent);
		}
				
		private function alternarNegrito():void {
			var formato:TextFormat = this.campoLegenda.getTextFormat ();
						
			formato.bold = !Boolean (formato.bold);
			
			this.campoLegenda.setTextFormat (formato);
			this.campoLegenda.defaultTextFormat = formato;
		}
				
		private function alternarItalico():void {
			var formato:TextFormat = this.campoLegenda.getTextFormat ();
						
			formato.italic = !Boolean (formato.italic);
			
			this.campoLegenda.setTextFormat (formato);
			this.campoLegenda.defaultTextFormat = formato;
		}
				
		private function aumentarFonte ():void {
			var formato:TextFormat = this.campoLegenda.getTextFormat ();
			var tamanhoFonte:int = int (formato.size);
			
			tamanhoFonte++;
			if (tamanhoFonte > 25) {
				tamanhoFonte = 25;
			}
			
			formato.size = tamanhoFonte;
			this.campoLegenda.setTextFormat (formato);
			this.campoLegenda.defaultTextFormat = formato;
		}
		
		private function diminuirFonte ():void {
			var formato:TextFormat = this.campoLegenda.getTextFormat ();
			var tamanhoFonte:int = int (formato.size);
			
			tamanhoFonte--;
			if (tamanhoFonte < 6) {
				tamanhoFonte = 6;
			}	
			
			formato.size = tamanhoFonte;
			this.campoLegenda.setTextFormat (formato);
			this.campoLegenda.defaultTextFormat = formato;
		}
		
		/**
		 * Método manipulador do evento KeyboardEvent.KEY_DOWN.
		 * @param	evento
		 */
		private function onKeyDownEvent(evento:KeyboardEvent):void {
			if (this.campoLegenda.text == "") {
				this.campoLegenda.text = " ";
			}
			
			if (evento.ctrlKey && (evento.keyCode == Keyboard.NUMPAD_ADD)) {
				this.aumentarFonte ();
			} 	
			
			if (evento.ctrlKey && (evento.keyCode == Keyboard.NUMPAD_SUBTRACT)) {
				this.diminuirFonte ();			
			}	
			
			if (evento.shiftKey && (evento.charCode == 66 || evento.charCode == 98)) {
				this.alternarNegrito ();			
			}	
			
			if (evento.shiftKey && (evento.charCode == 73 || evento.charCode == 105)) {
				this.alternarItalico ();			
			}
			
			if (evento.keyCode == Keyboard.SPACE) {
				this.playerVideo.controlarPlayPause ();		
			}
			
			/*
			if (evento.keyCode == Keyboard.RIGHT) {
				this.playerVideo.avancar (10);		
			}
			
			if (evento.keyCode == Keyboard.LEFT) {
				this.playerVideo.retroceder (10);		
			}
			*/
		}
		
		/**
		 * Método manipulador do evento PlayerVideoEvent.VIDEO_SEEK.
		 * Define o valor de this.chrono.increment através do percentual obtido.
		 * @param	evento
		 */
		private function onSeek(evento:PlayerVideoEvent):void {
			//this.campoLegenda.htmlText = " ";
			this.campoLegenda.text = " ";
			var videoTime:uint = evento.progresso * (this.playerVideo.duracao * 1000) / 100;
			this.chrono.increment = videoTime;
		}
		
		/**
		 * Método manipulador do evento PlayerVideoEvent.VIDEO_PLAY_PAUSE.
		 * Faz o controle de play e pause do temporizador chrono.
		 * @param	evento
		 */
		private function onPlayPause(evento:PlayerVideoEvent):void {
			this.chrono.togglePause ();
		}
		
		/**
		 * Método manipulador do evento Event.COMPLETE disparado pela instância de SRT, this.sub.
		 * Inicializa o playerVideo e o temporizador chrono.
		 * @param	evento
		 */
		private function onParseComplete (evento:Event):void {
			this.lista = this.sub.subtitlesList;
			
			this.playerVideo.listaDadosVideo = [new DadosVideo ("Lost", "Lost.S04E02.flv", "", 0)];
			this.playerVideo.iniciarVideo ();
			
			this.chrono.start ();
		}
		
		/**
		 * Método manipulador do evento ChronoTriggerEvent.UPDATE.
		 * Faz o atualização do texto exibido a cada iteração de tempo.
		 * @param	evento
		 */
		private function onUpdateTime (evento:ChronoTriggerEvent):void {
			
			var tempoAtual:uint = evento.time;
			
			/**
			 * Procura o indice do objeto SubtitleRow na lista.
			 */
			var qtd:uint = lista.length;
			for (var i:int = 0; i < qtd; i++) {
				var sRow:SubtitleRow = this.lista[i];
				var sSub:SubtitleTime = sRow.startTime;
				var eSub:SubtitleTime = sRow.endTime;
				var tStart:uint = ((sSub.hour * 60) * 60 * 1000) + ((sSub.minutes * 60) * 1000) + (sSub.seconds * 1000) + sSub.milliSeconds;
				var tEnd:uint = ((eSub.hour * 60) * 60 * 1000) + ((eSub.minutes * 60) * 1000) + (eSub.seconds * 1000) + eSub.milliSeconds;
				
				if (tStart <= tempoAtual && tempoAtual <= tEnd) {
					this.indice = i;
					break;
				}
			}
			
			/**
			 * Tratamento dos dados para ficar em conformidade com 
			 * uma única unidade (milissegundos).
			 */
			var subRow:SubtitleRow = this.lista[this.indice];
			var startSub:SubtitleTime = subRow.startTime;
			var endSub:SubtitleTime = subRow.endTime;
			var textoSub:String = subRow.text;
			var tempoStart:uint = ((startSub.hour * 60) * 60 * 1000) + ((startSub.minutes * 60) * 1000) + (startSub.seconds * 1000) + startSub.milliSeconds;
			var tempoEnd:uint = ((endSub.hour * 60) * 60 * 1000) + ((endSub.minutes * 60) * 1000) + (endSub.seconds * 1000) + endSub.milliSeconds;
			
			/**
			 * Exibe a legenda se acordo com tempo determinado.
			 */
			if (tempoStart < tempoAtual && tempoAtual < tempoEnd) {
				//this.campoLegenda.htmlText = textoSub;
				this.campoLegenda.text = textoSub;
			} else if (tempoEnd <= tempoAtual) {
				this.campoLegenda.text = " ";
				//this.campoLegenda.htmlText = " ";
				if (indice == this.lista.length) {
					this.chrono.stop ();
				}
			}
			
			this.status.text = String (tempoAtual) + " # < Start: " + String (tempoStart)  + " > # < End: " + String (tempoEnd) + " > ";
		}
	}	
}








